/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Rozvrh;

import Sablony.Zamestnanec;
import java.awt.Choice;
import java.awt.Dialog;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.IOException;
import java.util.Date;
import java.util.HashMap;
import java.util.TreeSet;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.*;

/**
 *  Trieda pracujúca so skupinami rozvrhov
 * @author MartinaHlinková
 */
public class LubaProjekt {
    private String nazov;
    //private TreeSet<Sablony.SablonaKlientov> sablonyKlientov;
    //private TreeSet<Sablony.SablonaZamestnancov> sablonyZamestnencov;
    // private Sablony.SablonaZamestnancov aktivnaSablonaZamestnancov;
    //private Sablony.SablonaKlientov aktivnaSablonaKlientov;
    private TreeSet<Rozvrh.RozvrhMesiaca> rozvrhyVProjekte;
    private Rozvrh.RozvrhMesiaca aktivnyRozvrh;
    
    /**
     * Konštrktor objektor vtriedy LubaProjekt, ktorý  vytváva jeden rozvrh
     * @param nazov názov skupiny
     * @param klienti   šablóna klientov
     * @param zamestnanci   šabl=ona zamestnancov
     * @param nastavenieZamestnancov    nastavenie zamestnancov
     * @param pociatok počiatočný dátum
     */
    public LubaProjekt(String nazov,Sablony.SablonaKlientov klienti,Sablony.SablonaZamestnancov zamestnanci,HashMap<Integer,Integer[]>nastavenieZamestnancov,Date pociatok){
        this.nazov = nazov;
        //this.sablonyZamestnencov = new TreeSet<Sablony.SablonaZamestnancov>();
        //this.sablonyZamestnencov.add(zamestnanci);
       // this.aktivnaSablonaZamestnancov = sablonyZamestnencov.first();
       // this.sablonyKlientov = new TreeSet<Sablony.SablonaKlientov>();
       // this.sablonyKlientov.add(klienti);
       // this.aktivnaSablonaKlientov = sablonyKlientov.first();

        Rozvrh.InformacieOMesiaci info = new Rozvrh.InformacieOMesiaci(pociatok, zamestnanci,nastavenieZamestnancov,klienti);
        
        Rozvrh.RozvrhMesiaca rozvrh = new Rozvrh.RozvrhMesiaca(info);
        this.rozvrhyVProjekte = new TreeSet<Rozvrh.RozvrhMesiaca>();
        this.rozvrhyVProjekte.add(rozvrh);
        this.aktivnyRozvrh = rozvrhyVProjekte.first();
        
    }
    /**
     * Konštruktor objektov triedy LubaProjekt so žiadnym rozvrhom
     * @param nazov názov skupiny rozvrhov
     */
    public LubaProjekt(String nazov){
        this.nazov = nazov;
        this.aktivnyRozvrh = null;
        this.rozvrhyVProjekte = null;
    }
    /**
     * Konštruktor objektov triedy LubaProjekt s niekoľkými rozvrhmi
     * @param nazov názov skupiny rozvrhov
     * @param rozvrhy rozvrhy v skupine
     */
    public LubaProjekt(String nazov,TreeSet<Rozvrh.RozvrhMesiaca> rozvrhy){
        this.nazov = nazov;
        this.rozvrhyVProjekte = rozvrhy;
        if(this.rozvrhyVProjekte.isEmpty()){
            this.aktivnyRozvrh = null;
        }else{
            this.aktivnyRozvrh = rozvrhyVProjekte.first();
        }
    }
            
    /**
     * Metóda, ktorá vracia rozvrh, s ktorým sa momentálne pracuje.
     * @return rozvrh, s ktorým sa momentálne pracuje
     */     
    public Rozvrh.RozvrhMesiaca getAktivnyRozvrh(){
        return this.aktivnyRozvrh;
    }
    /**
     * Metóda, ktorá načíta skupinu rozvrhov z trvalej pamäte
     * @param xml   súbor, v ktorého sa má čítať
     * @return načítaná skupúina rozvrhov
     */
    public static Rozvrh.LubaProjekt nacitajProject(File xml){
        Rozvrh.LubaProjekt navrat = null;
        
        if(xml == null)return null;
        
         try {
            DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
            DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
            Document doc = dBuilder.parse(xml);
            doc.getDocumentElement().normalize();

            NodeList nList = doc.getElementsByTagName("rozvrh"); // list s uzlami rozvrhov
            if(nList == null || nList.getLength() == 0)return null;
            
            // ziskanie mena projektu
                String meno = xml.getPath();
                if(meno == null)return null;
                char data[] = {'\\', '\\'};
                String strRegex = new String(data);
                String str[] = meno.split(strRegex);
                
                meno = str[str.length-1];
                
                char data1[] = {'\\','.', };
                strRegex = new String(data1);
                str = meno.split(strRegex);
                if(str == null || str.length != 2) return null;
                meno = str[0];
             //ziskanie rozvrhov
           TreeSet<Rozvrh.RozvrhMesiaca> rozvrhy = new TreeSet<Rozvrh.RozvrhMesiaca>();
                
           for(int i = 0; i< nList.getLength();i++){
               Node nNode = nList.item(i);
               if (nNode.getNodeType() == Node.ELEMENT_NODE) {
                   Element eElement = (Element) nNode;
                   Rozvrh.RozvrhMesiaca rozvrh = Rozvrh.RozvrhMesiaca.parsujRozvrh(eElement);
                   if(rozvrh != null){
                       rozvrhy.add(rozvrh);
                   }
               }
           }
           
           navrat = new LubaProjekt(meno,rozvrhy);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return navrat;
    }
    /**
     * Metóda, ktorá uloží skupinu rozvrhov do trvalej pamäti
     */
    public int ulozProjekt(String path){
         try {
		Document doc = vytvorDokumentDOM();
		
                
                TransformerFactory transformerFactory = TransformerFactory.newInstance();
		Transformer transformer = transformerFactory.newTransformer();
		DOMSource source = new DOMSource(doc);
                StreamResult result;
                if(path == null){
                    File newFile = new File(this.nazov+".xpr");
                    result = new StreamResult(newFile.toURI().getPath());
                  
                }else{
                    File newFile = new File(path+".xpr");
                    
                    if(newFile.createNewFile() == true){
                        result = new StreamResult(newFile.toURI().getPath());
                        
                    }else{
                        return -1;
                    }
                    
                }

                transformer.transform(source, result);
                
         }
         catch (IOException ex){
            ex.printStackTrace();
         }
        catch (TransformerException tfe) {
		tfe.printStackTrace();
	  }
         return 0;
    }
    public Document vytvorDokumentDOM(){
         try {
        DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
	DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
        // root elements
		Document doc = docBuilder.newDocument();
		Element rootElement = doc.createElement("projektRozvrhov");
		doc.appendChild(rootElement);
                
                for(Rozvrh.RozvrhMesiaca itRozvrh: this.rozvrhyVProjekte){
                    Element rozvrh = doc.createElement("rozvrh");
                    rootElement.appendChild(rozvrh);
                    
                    Attr attrMesiac = doc.createAttribute("mesiac");
                    attrMesiac.setValue(itRozvrh.getInfo().getMasiac().toString());
                    rozvrh.setAttributeNode(attrMesiac);
                    
                    Attr attrRok = doc.createAttribute("rok");
                    attrRok.setValue(Integer.toString(itRozvrh.getInfo().getRok()));
                    rozvrh.setAttributeNode(attrRok);
                    
                    Attr attrPocetDni = doc.createAttribute("pocetDni");
                    attrPocetDni.setValue(Integer.toString(itRozvrh.getInfo().getPocetDni()));
                    rozvrh.setAttributeNode(attrPocetDni);
                    
                    Element charakterDna = doc.createElement("CharakterDna");
                    String dni = "";
                    for(int i = 0; i< itRozvrh.getInfo().getPocetDni();i++){
                        dni =dni+":"+itRozvrh.getInfo().getCharakterDni()[i];
                    }
                    charakterDna.appendChild(doc.createTextNode(dni));
                    rozvrh.appendChild(charakterDna);
                    
                    Element klienti = doc.createElement("klientiVDnoch");
                    dni = "";
                    for(int i = 0; i< itRozvrh.getInfo().getPocetDni();i++){
                        dni = dni+":"+itRozvrh.getInfo().getKlientiVDnoch()[i];
                    }
                    klienti.appendChild(doc.createTextNode(dni));
                    rozvrh.appendChild(klienti);
                    
                    Element nastavenieZamestnancov = doc.createElement("nastavenieZamestnancov");
                    for(Integer iterID: itRozvrh.getInfo().getNastavenieZamestnancov().keySet()){
                        Element zamestnanecInfo = doc.createElement("zamestnanecInfo");
                        
                            Attr attrIdZamestnanca = doc.createAttribute("ID");
                            attrIdZamestnanca.setValue(""+iterID);
                            zamestnanecInfo.setAttributeNode(attrIdZamestnanca);
                        
                                Attr attrSaldoM = doc.createAttribute("minulost");
                                InformacnaStruktura.CasBezDatumu min = itRozvrh.getInfo().getNastavenieZamestnancov().get(iterID).getPrenostMinulehoObdobia();
                                int value = min.getHodiny()*60+min.getMinuty();
                                if(itRozvrh.getInfo().getNastavenieZamestnancov().get(iterID).getTypSaldaMinulost() == InformacnaStruktura.TypSalda.NEDOPOCETNE){
                                    value *= (-1);
                                }
                                attrSaldoM.setValue(""+value);
                                zamestnanecInfo.setAttributeNode(attrSaldoM);
                            
                                Attr attrSaldoB = doc.createAttribute("buducnost");
                               InformacnaStruktura.CasBezDatumu bud = itRozvrh.getInfo().getNastavenieZamestnancov().get(iterID).getPrenostBuducehoObdobia();
                                value = bud.getHodiny()*60+bud.getMinuty();
                                if(itRozvrh.getInfo().getNastavenieZamestnancov().get(iterID).getTypSaldaBuducnost() == InformacnaStruktura.TypSalda.NEDOPOCETNE){
                                    value *= (-1);
                                }
                                attrSaldoB.setValue(""+value);
                                zamestnanecInfo.setAttributeNode(attrSaldoB);
                                
                                Rozvrh.Zmeny[] zmenyZamestnanca = itRozvrh.getRozvrh().get(iterID);
                                for(int i = 1; i<=zmenyZamestnanca.length;i++){
                                    Element zmena;
                                    if(zmenyZamestnanca[i-1] == null){
                                        zmena = doc.createElement("zmena");
                                    }else{
                                        zmena = zmenyZamestnanca[i-1].zmenaDoElementu(doc);
                                    }
                                    Attr attrDen = doc.createAttribute("den");
                                    attrDen.setNodeValue(""+i);
                                    zmena.setAttributeNode(attrDen);
                                    zamestnanecInfo.appendChild(zmena);
                                }
                            
                        nastavenieZamestnancov.appendChild(zamestnanecInfo);
                    }
                    
                    rozvrh.appendChild(nastavenieZamestnancov);
                    
                     Element zamestnanci = doc.createElement("zamestnanci");
                     
                     for(Integer iterID: itRozvrh.getInfo().getMnozinaZamestnancov().keySet()){
                         Element zamestnanec = itRozvrh.getInfo().getMnozinaZamestnancov().get(iterID).zamestnanecToElement(doc);
                         zamestnanci.appendChild(zamestnanec);
                     }
                     
                     rozvrh.appendChild(zamestnanci);
                }
                return doc;
        }
         catch (ParserConfigurationException pce) {
		pce.printStackTrace();
                return null;
	  } catch (Exception e) {
		e.printStackTrace();
                return null;
	  }
    }
    /**
     * Metóda, ktorá vráti názov skupiny rozvrhov
     * @return názov skupiny rozvrhov
     */
    public String getNazov() {
        return nazov;
    }
    
}
